

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class CrossBridge{//定义一个过桥类
    //成员变量
    private static Bridge bridge = new Bridge();//实例化一个桥对象，作为共享资源
    private static int countW = 0;//统计西边到达对岸的人
    private static int countE = 0;//统计东边到达对岸的人

    public static void main(String[] args) {//在main()方法中创建线程，每个线程为一个人
        for (int i = 1; i <= 20; i++) {//循环20次，桥东边和桥西边各20个人
            String w = 'W'+String.valueOf(i);//用于命名桥西边过桥的人
            String e = 'E'+String.valueOf(i);//用于命名桥东边过桥的人
            //通过Threah类的构造方法创建线程，任务为过桥
            Thread threadW = new Thread(new WestCross());//西边的人过桥
            Thread threadE = new Thread(new EastCross());//东边的人过桥
            //调用setName()方法设置过桥人(线程)的名字
            threadW.setName(w);
            threadE.setName(e);
            //调用start()方法启动线程
            threadW.start();
            threadE.start();
        }
    }

    //定义一个内部静态类 - 用于创建西边的人过桥的任务
    public static class WestCross implements Runnable{
        @Override
        public void run() {//重写run()方法
            bridge.cross(Thread.currentThread().getName());//调用桥的cross()方法过桥
            countW++;//西边到达对岸的人+1
            if (countW==20){
                System.out.println("西边的人全部到达对岸");
            }
        }
    }

    //定义一个内部静态类 - 用于创建东边的人过桥的任务
    public static class EastCross implements Runnable{
        @Override
        public void run() {//重写run()方法
            bridge.cross(Thread.currentThread().getName());//调用桥的cross()方法过桥
            countE++;//东边到达对岸的人+1
            if (countE==20){
                System.out.println("东边的人全部到达对岸");
            }
        }
    }

    //定义一个内部静态类 - 桥 - 作为线程的共享资源
    public static class Bridge{
        private static Lock lock = new ReentrantLock();//创建一个锁
        public void cross(String p){//定义一个过桥方法
            lock.lock();//使用线程锁保证每次只能有一个人过桥
            try{
                System.out.print(p+"正在过桥，");//输出XX正在过桥
                Thread.sleep(500);
            }catch (InterruptedException e){}
            finally {
                lock.unlock();//过桥完毕，解锁允许下一个人过桥
            }
        }
    }
}

